home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_10_06 / 1006078a < prev    next >
Text File  |  1992-04-22  |  2KB  |  108 lines

  1. #include "makedef.h"
  2. #include <sys\stat.h>
  3.  
  4. #define    FNFERR (-1)    /* stat error: file not found */
  5.  
  6. long    process_dependency(TARGET *head, char *build_target)
  7. {
  8. TARGET    *p;
  9. time_t    dependent_t;
  10. int    rebuilt;
  11.  
  12. if (p = search_target_list(head, build_target))
  13.     rebuilt = build_target(head, p, &dependent_t);
  14. else
  15.     fatal_error("build target not found");
  16.  
  17. if (!rebuilt)
  18.     printf("\n'%s' is up to date.",build_target);
  19. }
  20.  
  21.  
  22.  
  23. TARGET     *search_target_list(TARGET *head, char *target)
  24. {
  25. while (head && strcmp(target, head->target))
  26.     head = head->link;
  27. return head;
  28. }
  29.  
  30.  
  31.  
  32. long    exec_cmd_list(CMD *p)
  33. {
  34. int    status;
  35.  
  36. while (p) {
  37.     printf("\n%s",p->cmdstr);
  38.     status = system(p->cmdstr);
  39.       if (status)
  40.        exit(status);
  41.       p = p->link;
  42. }
  43. }
  44.  
  45.  
  46.  
  47. long    build_target(TARGET *head, TARGET *p, time_t *parent_t)
  48. {
  49. DEP    *q;
  50. TARGET    *r;
  51. long    status = 0;
  52. time_t    dependent_t;
  53. time_t    newest_t;
  54. time_t    current_vertex_t;
  55. struct    stat statbuf;
  56.  
  57. /*+++++ Initialization +++++*/
  58.  
  59. p->color = GRAY;
  60. if (FNFERR == stat(p->target, &statbuf))
  61.     statbuf.st_mtime = 0;
  62. newest_t = current_vertex_t = statbuf.st_mtime;
  63.  
  64. /*++++ Check current vertex's dependencies +++++*/
  65.  
  66. q = p->deplink;
  67. while (q) {
  68.         if (NULL == (r = search_target_list(head, q->depstr))) {
  69.     if (FNFERR == stat(q->depstr, &statbuf))
  70.         fatal_error("dependency not found");
  71.     else
  72.         dependent_t = statbuf.st_mtime;
  73.     } else {
  74.     switch (r->color) {
  75.         case WHITE:
  76.         build_target(head, r, &dependent_t);
  77.         break;
  78.         case GRAY:
  79.         fatal_error("recursive dependency found");
  80.         break;
  81.         case BLACK:
  82.         dependent_t = statbuf.st_mtime;
  83.         break;
  84.     }
  85.     }
  86.     if (dependent_t > newest_t)
  87.     newest_t = dependent_t;
  88.     q = q->link;
  89. }
  90.  
  91. /*++++  Execute command list ++++*/
  92.  
  93. if (newest_t > current_vertex_t) {
  94.     status++;
  95.         exec_cmd_list(p->cmdlink);
  96.     if (FNFERR == stat(p->target, &statbuf))
  97.     fatal_error("commands did not update target");
  98.     newest_t = statbuf.st_mtime;
  99. }else
  100.     newest_t = current_vertex_t;
  101.  
  102. /*++++ Cleanup ++++*/
  103.  
  104. p->color = BLACK;
  105. *parent_t = newest_t;
  106. return status;
  107. }
  108.